#ifndef __ZHI_XING_HH__
#define __ZHI_XING_HH__
#include "esp_err.h"

#define SHIJIAN 0
/**
 * @brief 消息传递结构体
 */
typedef struct 
{
    char id[SHI_BEI_ID];
    char ips[WIFI_SSID_LEN];
    char vvs[WIFI_PASS_LEN];
    uint16_t lx;
    uint16_t kaiShi;
    uint16_t jieShu;
}jsonJ, *jsonJP;

/**
 * @brief 消息队列初始化
 */
void queue_init();

// 多线程,从队列接收的任务。
void led_pwm(void *pvParameters);         // PWM控制
void xi_tong_kong_zhi(void *pvParameter); // 系统设置
void xiao_xi_fen_fa(void *arg);           // 消息分发
void ping_task(void *pvParameter);

/*掉电数据保存*/

/**
 * @brief 清空NVS
 */
void nvs_erase();

/**
 * @brief 删除wifi连接信息
 *
 * 这个是删除系统自动保存的WIFI连接信息
 */
bool delete_wifi_credentials();

/**
 * @brief nvs初始化
 */
void nvs_init();

/**
 * @brief     nvs读取数据 字符串
 * @param mingMingKongJIanI8P  命名空间
 * @param key  键名
 * @param strSZP 保存读取字符串的数组(缓冲区)
 * @return
 *      成功: ESP_OK
 *      失败: 其他错误代码
 **/
esp_err_t nvs_du_qu_str(const char *mingMingKongJIanI8P, const char *key, char *strSZP);

/**
 * @brief     nvs保存数据 字符串
 * @param mingMingKongJIanI8P  命名空间
 * @param key  键名
 * @param strSZP 要保存的字符串
 * @return
 *      成功: ESP_OK
 *      失败: 其他错误代码
 **/
esp_err_t nvs_tian_jia_str(const char *mingMingKongJIanI8P, const char *key, const char *str);

/**
 * @brief     保存WIFI连接信息到NVS
 * @param jsonP  包含wifi连接信息的结构体,ips为ssid,vvs为pass
 * @return
 *      成功: true
 *      失败: false
 **/
bool wifi_set(jsonJP jsonP);

/**
 * @brief     从NVS里读取wifi连接信息,并以此信息配置和启动WIFI
 * @param data  包含wifi连接信息的字符串;"wwcccxxx/chenxin1234567890" = ww  cccxxx  chenxin1234567890
 * @return
 *      成功: true
 *      失败: false
 **/
bool wifi_Start();

/**
 * @brief     删除给定命名空间里的所有键值对
 * @param jsonP  jsonP->ips表示命名空间
 * @return
 *      成功: true
 *      失败: false
 **/
bool nvs_shan_chu_all(jsonJP jsonP);

/**
 * @brief     删除给定命名空间里的指定键值对
 * @param jsonP  jsonP->ips命名空间;jsonP->vvs要删除的键值
 * @return
 *      成功: true
 *      失败: false
 **/
bool nvs_shan_chu_key(jsonJP jsonP);

/**
 * @brief       NVS保存str类型的键值到wangLuo命名空间里
 * @param jsonP  结构体指针
 * @return
 *      成功: ESP_OK
 *      失败: 其他错误代码
 **/
esp_err_t nvs_tian_jia_wangLuo(jsonJP jsonP);

/**
 * @brief       NVS保存uint16_t类型的名为 liangDu 键 值到ZIDINGYI_NVS_KONG_JIAN命名空间里
 * @param ld    亮度值,范围1-10
 * @return
 *      成功: ESP_OK
 *      失败: 其他错误代码
 **/
esp_err_t nvs_set_liang_du(uint16_t ld);

/**
 * @brief       NVS取出uint16_t类型的名为 liangDu 键 值
 * @param ld  取出后需要转换为float类型的变量
 * @return
 *      成功: ESP_OK
 *      失败: 其他错误代码
 **/
esp_err_t nvs_get_liang_du(uint16_t* ld);

/**
 * @brief       对比当前系统时间是否在输入时间之间
 * @param kaiShi  开始的时间
 * @param jieShu  结束的时间
 * @return
 *      0: 成功
 *      -1: 其他错误代码
 *      1 :系统时间错误,未网络校准
 *      2:输入的数据超出范围
 **/
int16_t shi_jian_dui_bi_shi(uint16_t kaiShi, uint16_t jieShu, uint16_t kaiShiFen, uint16_t jieShuFen);

/**
 * @brief      处理分发接收到的JSON数据
 * @param data  字符串
 *          注意:使用cJSON_Delete销毁内存时,不能多次调用,只能销毁一次
 * @return
 *      成功: true
 *      失败: false
 **/
bool json_chu_li(const char *data);

/**
 * @brief       计算字符串长度,包含'\0'
 * @param data  字符串
 * @return
 *      成功: 字符串长度
 **/
uint16_t data_len(const char *data);



/**
 * @brief       获取NVS保存的中断生效时间
 * @param kaiShiShi  开始时
 * @param jieShuShi  结束时
 * @param kaiShiFen  开始分
 * @param jieShuFen  结束分
 * @return 
 *      如果没有保存数据,或者读取失败,时间返回初始化设置
 **/

bool nvs_bao_cun_shi_jian(jsonJP jsP);






#if SHIJIAN == 1
void shi_jian_xiang(const char *data);

/**
 * @brief     将字符串中数字转换为uint64_t类型整数
 * @param data  数据.例;const char *data = "wxxl\\123456789012"
 *              下标1表示操作方法,下标2表示要获取的数据类型,下标3位校验数据长度(总长度)"\"为数据分隔符,
 *              依次为:数据头\命名空间\键名\键值
 * @return
 *      uint64_t 将字符串中123456789012转换为uint64_t类型整数
 **/
int64_t shi_jian_xiao_zhun(const char *data);

/**
 * @brief       时间校准
 * @param data  数据.例;const char *data = "wxxl\\123456789012"
 *              下标1表示操作方法,下标2表示要获取的数据类型,下标3位校验数据长度(总长度)"\"为数据分隔符,
 *              依次为:数据头\命名空间\键名\键值
 * @return
 *      无
 **/
void shi_jian_jiao_jun(const char *data);
#endif

#endif //__ZHI_XING_HH__
